﻿using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using Extensibility;
using NetOffice.VBIDEApi;
using static 枸杞VBE插件.VBE助手;

namespace 枸杞VBE插件
{
    /// <summary>
    ///COM加载项实现 IDTExtensibility2 接口
    /// </summary>
    [ComVisible(true), Guid("E2EF0397-AE4B-4E00-B2BE-0875D93517F9"), ProgId("枸杞VBE插件")]
    public class Connect : IDTExtensibility2, Rougamo.IRougamo<InfoAttribute>
    {
        /// <summary>
        /// 在连接COM加载项时发生。
        /// </summary>
        /// <param name="Application">Application参数是COM加载项所附加到的Application对象，VBE加载项对应的就是VBE对象。</param>
        /// <param name="ConnectMode">ConnectMode参数指定COM加载项的连接方式。
        /// <para>ext_cm_Startup：COM加载项在程序启动时连接。</para>
        /// <para>ext_cm_AfterStartup：COM加载项在程序启动后，手动启用时连接。</para>
        /// <para>其他连接方式忽略，用不到。</para>
        /// </param>
        /// <param name="AddInInst"></param>
        /// <param name="custom"></param>
        public void OnConnection(object Application, ext_ConnectMode ConnectMode, object AddInInst, ref Array custom)
        {
            VBE助手实例.VBE对象 = new VBE(null, Application);
            VBE助手实例.Addin = new AddIn(null, AddInInst)
            {
                Object = new VBEAddin()
            };
            //Log.Info(ConnectMode.ToString());
            if (ConnectMode != ext_ConnectMode.ext_cm_Startup)//用户手动加载时不触发OnStartupComplete,强制触发
            {
                OnStartupComplete(ref custom);
            }
        }

        /// <summary>
        ///如果COM加载项在启动时连接，则在程序完成其启动时发生。如果程序启动时未连接加载项，即使用户在“COM加载项”对话框或“外接程序管理器”对话框中手动连接该加载项，也不会发生此事件。
        /// </summary>
        /// <param name="custom"></param>
        public void OnStartupComplete(ref Array custom)
        {
            VBE助手实例.初始化();
        }

        /// <summary>
        ///在COM加载项断开连接时发生。
        /// </summary>
        /// <param name="RemoveMode">RemoveMode参数指定COM加载项断开连接的方式。
        /// <para>ext_dm_HostShutdown外接程序在程序关闭时断开连接</para>
        /// <para>ext_dm_UserClosed外接程序在用户手动取消时断开连接</para>
        /// <para>其他方式忽略,用不到</para>
        /// </param>
        /// <param name="custom"></param>
        public void OnDisconnection(ext_DisconnectMode RemoveMode, ref Array custom)
        {
            if (RemoveMode != ext_DisconnectMode.ext_dm_HostShutdown)//用户手动取消加载时不触发OnBeginShutdown,强制触发
            {
                OnBeginShutdown(ref custom);
            }
        }

        /// <summary>
        /// 如果COM加载项已连接，则在程序开始关闭时发生。
        /// </summary>
        /// <param name="custom"></param>
        public void OnBeginShutdown(ref Array custom)
        {
            VBE助手实例.Dispose();
        }

        /// <summary>
        /// 当连接的COM外接程序集发生更改时，即当任何其他外接程序连接或断开连接时发生。
        /// </summary>
        /// <param name="custom"></param>
        public void OnAddInsUpdate(ref Array custom)
        {
            //没有用
        }
    }
}